أساسيات Systemd: العمل مع الخدمات، الوحدات Units، واليوميات Journal
في عالم أنظمة تشغيل لينكس الحديثة، أصبح نظام إدارة الخدمات Systemd أحد الركائز الأساسية التي تتحكم في بدء وتشغيل وإدارة خدمات النظام بشكل فعال ومنظم. نظام Systemd لم يقتصر فقط على استبدال النظام القديم init، بل قدم منظومة متكاملة لإدارة النظام والخدمات بشكل موحد ومتقدم، مما جعل عملية التحكم في الخدمات والعمليات والنظام أكثر مرونة وسهولة، مع تحسين كبير في الأداء والاعتمادية. في هذا المقال، سنتناول بشكل موسع أساسيات Systemd، مع التركيز على مكونات النظام المهمة مثل الخدمات (Services)، الوحدات (Units)، واليوميات (Journal).
مقدمة عن Systemd
Systemd هو نظام إدارة الخدمات والنظام في أنظمة لينكس الحديثة، صمم ليعمل كـ “PID 1” أو العملية الأولى التي تُشغل عند إقلاع النظام. هدف Systemd هو تبسيط وتعزيز عملية بدء النظام، إدارة الخدمات، ومراقبة أداء النظام، بالإضافة إلى تقديم آليات متقدمة لليومية (Logging) والتزامن بين العمليات.
قبل Systemd، كان يعتمد أغلب توزيعات لينكس على نظم init التقليدية مثل SysVinit أو Upstart، والتي كانت تعتمد على سكريبتات بدائية لتشغيل الخدمات، ما جعل إدارة الخدمات بطيئة ومعقدة. Systemd غيّر هذا المشهد بشكل جذري، وأصبح الآن هو النظام الافتراضي لإدارة الخدمات في أغلب التوزيعات الشهيرة مثل Fedora، Ubuntu، Debian، وCentOS.
مفهوم الوحدات Units في Systemd
في Systemd، يتم تمثيل كل عنصر من عناصر النظام أو الخدمة كوحدة تسمى Unit. الوحدة هي مفهوم شامل يعبر عن أي كائن يمكن إدارته بواسطة Systemd. تشمل الوحدات أنواعًا مختلفة بحسب طبيعة العنصر:
-
Service Units: تمثل خدمات النظام التي تعمل في الخلفية (daemons).
-
Socket Units: تدير مآخذ الشبكة التي تنتظر الاتصالات.
-
Target Units: تُستخدم لتجميع وحدات متعددة معًا في نقطة بداية مشتركة.
-
Device Units: تمثل أجهزة مادية أو وهمية متصلة بالنظام.
-
Mount Units: تمثل نقاط تركيب الملفات (mount points).
-
Automount Units: تدير نقاط تركيب تلقائية.
-
Timer Units: تُستخدم لتنفيذ مهام مجدولة بشكل متكرر أو عند وقت محدد.
-
Swap Units: تدير مساحة التبادل (swap space).
-
Path Units: تراقب تغييرات الملفات أو الدلائل وتطلق إجراءات معينة.
-
Slice Units: تُستخدم لتنظيم الموارد (cgroups) بين العمليات.
بنية ملف الوحدة (Unit File)
يتم تعريف كل وحدة في ملف نصي بصيغة معينة، ويحتوي هذا الملف على عدة أقسام رئيسية:
-
[Unit]: يحتوي على وصف الوحدة، المتطلبات، والتبعيات.
-
[Service]: خاص بوحدات الخدمات ويحدد كيفية تشغيل الخدمة.
-
[Install]: يحدد كيفية تمكين أو تعطيل الوحدة أثناء عملية الإقلاع.
مثال مبسط لوحدة خدمة:
ini[Unit]
Description=خدمة ويب بسيطة
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/my-web-service
[Install]
WantedBy=multi-user.target
إدارة الخدمات Service Management
الخدمات هي أهم أنواع الوحدات في Systemd، حيث تمثل البرامج التي تعمل في الخلفية، مثل خوادم الويب، قواعد البيانات، وخدمات النظام المختلفة.
تشغيل، إيقاف، وإعادة تحميل الخدمات
يمكن التحكم في الخدمات باستخدام الأمر systemctl، الذي هو أداة التحكم الأساسية في Systemd.
-
تشغيل الخدمة:
pgsqlsystemctl start service-name.service
-
إيقاف الخدمة:
arduinosystemctl stop service-name.service
-
إعادة تشغيل الخدمة:
pgsqlsystemctl restart service-name.service
-
إعادة تحميل إعدادات الخدمة دون إيقافها:
nginxsystemctl reload service-name.service
-
تمكين الخدمة عند الإقلاع:
pgsqlsystemctl enable service-name.service
-
تعطيل الخدمة من الإقلاع التلقائي:
pgsqlsystemctl disable service-name.service
حالة الخدمة ومراقبتها
لمعرفة حالة أي خدمة، يمكن استخدام الأمر:
luasystemctl status service-name.service
سيعرض هذا الأمر معلومات تفصيلية تشمل حالة الخدمة، آخر الرسائل المسجلة، ومدة التشغيل.
أنواع خدمات Service Types
Systemd يدعم عدة أنواع للخدمات، وهي مهمة لفهم كيفية إدارة العملية داخل النظام:
-
simple: يُفترض أن العملية تبدأ فورًا ولا تحتاج إلى مزيد من التنسيق.
-
forking: يستخدم للخدمات التي تقوم بعمل fork (إنشاء عملية فرعية) عند التشغيل، وهو أسلوب تقليدي.
-
oneshot: خدمات تنفذ مهمة محددة ثم تنتهي، مثل مهام الإعداد أو التهيئة.
-
dbus: خدمات تعتمد على D-Bus لتشغيلها.
-
notify: الخدمات التي ترسل إشعارًا إلى Systemd عند الانتهاء من الإقلاع.
-
idle: يتم تشغيل الخدمة عندما يكون النظام خاملًا.
نظام اليوميات Journal
من الميزات القوية التي يقدمها Systemd هي نظام اليوميات المدمج المعروف بـ journal، والذي يعتبر بديلاً متطورًا عن نظام التسجيل التقليدي syslog.
مميزات Journal
-
تخزين مركزي: يجمع كافة سجلات النظام والخدمات في مكان واحد.
-
هيكلية البيانات: يتم تسجيل البيانات بطريقة منظمة تسمح بالبحث والفهرسة حسب الوقت، الخدمة، المعرفات، وغيرها.
-
تكامل كامل مع Systemd: حيث يتم تسجيل كل نشاط ووظيفة في النظام بدقة.
-
دعم تنسيقات متعددة: يمكن عرض السجلات بصيغ متعددة مع إمكانية تصديرها.
-
التخزين في الذاكرة أو القرص: يمكن تخزين السجلات مؤقتًا في الذاكرة أو بشكل دائم على القرص.
عرض السجلات باستخدام journalctl
الأداة الأساسية للوصول إلى اليوميات هي journalctl، التي تسمح بعرض وتصفية السجلات بمرونة عالية.
-
عرض كامل السجلات:
nginxjournalctl
-
عرض سجلات خدمة محددة:
nginxjournalctl -u service-name.service
-
عرض السجلات الجديدة في الوقت الحقيقي:
nginxjournalctl -f
-
عرض السجلات حسب وقت محدد:
bashjournalctl --since "2025-05-01 10:00:00" --until "2025-05-01 12:00:00"
-
عرض السجلات مع مستوى خطورة معين:
cssjournalctl -p err
ضبط حجم وسلوك Journal
يمكن تعديل إعدادات Journal في ملف /etc/systemd/journald.conf لتحديد حجم السجلات، مكان التخزين، وأسلوب الضغط. يمكن مثلاً تحديد حجم التخزين المؤقت أو تفعيل الضغط لتوفير المساحة.
تنظيم التبعية Dependency Management
واحدة من أهم خصائص Systemd هي إدارة التبعية بين الوحدات، والتي تسمح بتسلسل بدء الخدمات بشكل دقيق ومرن. يمكن تحديد أن وحدة ما يجب أن تبدأ فقط بعد وحدة أخرى، أو أن وحدتين مرتبطتان بشكل متزامن.
أنواع التبعيات الشائعة في ملفات الوحدات:
-
Requires=: الوحدة تعتمد على وحدة أخرى، وإذا لم تكن هذه الوحدة متاحة، لن تعمل.
-
Wants=: الوحدة تفضل أن تكون الوحدة الأخرى متاحة، لكنها ليست ضرورية.
-
Before= و After=: ترتيب بدء الوحدات، حيث يمكن تحديد أن وحدة تبدأ قبل أو بعد وحدة أخرى.
-
Conflicts=: تعارض بين وحدتين، بحيث لا يمكن تشغيلهما معًا.
التحكم في الإقلاع Boot Control
يتيح Systemd التحكم الدقيق في مراحل إقلاع النظام عن طريق استخدام وحدات من نوع Target، التي تمثل مجموعة من الخدمات التي يجب أن تعمل في مرحلة معينة.
أمثلة على Target Units:
-
basic.target: مرحلة التهيئة الأساسية.
-
multi-user.target: المرحلة التي توفر بيئة متعددة المستخدمين بدون واجهة رسومية.
-
graphical.target: المرحلة التي تبدأ فيها واجهة المستخدم الرسومية.
-
default.target: الوحدة الافتراضية التي يحددها النظام للإقلاع إليها.
يمكن استخدام الأمر:
arduinosystemctl get-default
لمعرفة الوحدة الافتراضية للإقلاع، ويمكن تغييرها باستخدام:
cppsystemctl set-default graphical.target
جدولة المهام Timer Units
تعتبر Timer Units بديلًا متقدمًا عن Cron، حيث يمكن من خلالها جدولة تنفيذ المهام بشكل دقيق ومتكامل مع نظام Systemd.
مثال على ملف Timer
ini[Unit]
Description=تشغيل مهمة كل 15 دقيقة
[Timer]
OnBootSec=10min
OnUnitActiveSec=15min
Unit=my-task.service
[Install]
WantedBy=timers.target
الجدول التالي يوضح مقارنة بين بعض المفاهيم والخصائص في Systemd و init التقليدي:
| الخاصية | Systemd | init التقليدي (SysVinit) |
|---|---|---|
| إدارة الخدمات | تعتمد على ملفات وحدات (Unit files) | تعتمد على سكريبتات shell |
| التبعية | إدارة تبعيات معقدة (Requires, Wants) | بسيطة وغير ديناميكية |
| تسجيل السجلات | نظام journal متكامل ومتقدم | تعتمد على syslog منفصل |
| الأداء | أسرع بفضل بدء متوازي وخاصيات ذكية | أبطأ لبدء الخدمات بشكل متسلسل |
| الجدولة | Timer units متكامل | Cron منفصل |
| مرونة التحكم | دعم واسع لأنواع متعددة من الوحدات | محدود على الخدمات فقط |
خلاصة
Systemd هو نظام متكامل لإدارة الخدمات والعمليات في أنظمة لينكس، يوفر بيئة متطورة وموحدة للتحكم في تشغيل النظام. من خلال مفاهيم الوحدات المختلفة، وإدارة الخدمات بشكل ذكي، ونظام اليوميات المتقدم، يضمن Systemd أداء عاليًا، مرونة في التخصيص، وسهولة في الصيانة. التعامل مع ملفات الوحدات وفهم التبعيات بين الخدمات هو أساس لاستخدام Systemd بكفاءة. بالإضافة إلى ذلك، توفر أدوات مثل systemctl و journalctl واجهات عملية لإدارة النظام ومراقبته بشكل فعال.
مصادر ومراجع
-
Systemd Official Documentation: https://www.freedesktop.org/wiki/Software/systemd/
-
Linux Journal – Understanding systemd: https://www.linuxjournal.com/content/understanding-systemd
هذا المقال يغطي بشكل شامل أساسيات نظام Systemd في بيئة لينكس الحديثة، ويوفر قاعدة معرفية قوية للتعامل مع الخدمات، الوحدات، واليوميات بطريقة احترافية وفعالة.

